Unter defensivem Programmieren wird eine Programmierung von Computersystemen verstanden, die möglichst viele Voraussetzungen selbst überprüft, bevor der eigentliche Selbstzweck erfüllt wird. Ein Programmierer ist mit verschiedenen bekannten und unbekannten Aspekten bezüglich Benutzer-Eingabe, verschiedener Betriebssysteme und -Versionen konfrontiert. Die so defensiv programmierten Applikationen sind misstrauisch gegenüber allen Eingaben und Voraussetzungen und verhalten sich gegenüber Verstößen robust. Durch das Voraussehen möglichst vieler Umstände laufen sie weiter oder brechen in einem geordneten Prozess ab.
Ein Alternativansatz zur defensiven Programmierung ist Design by contract. Dabei stellt diejenige Komponente, welche die Dienstleistung einer anderen Komponente in Anspruch nimmt, lediglich auf der Basis eines Vertrages eine Reihe von Vorbedingungen sicher und verlässt sich auf Nachbedingungen, die für die Dienstleistung im Vertrag definiert wurden. Bei defensiver Programmierung wären hingegen die Vorbedingungen unklar, während die Nachbedingungen von der in Anspruch nehmenden Komponente überprüft werden müssten.
Ein System muss sich nicht einem einzigen Konzept verschreiben. Grundsätzlich lässt es sich so aufteilen, dass Einwirkungen von außen (Benutzereingaben, Datenimport, API) defensiv zu handhaben sind, während das bei inneren Abläufen nicht erforderlich ist.